home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
utils
/
sano
/
sano.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-03
|
13KB
|
263 lines
;*
;
; ### Sano.asm by JM v 0.20c ###
;
; - Created 901025 by JM -
;
; Bugs: Well...
;
;
; Edited:
;
; - 901025 by JM -> v0.01 - started writing this thing.
; - 901029 by JM -> v0.10 - works. dpy_msg has a buffer of 256 bytes.
; - 901220 by JM -> v0.20c - this version commented for C=Lehti.
;
;
include "exec/types.i"
include "exec/execbase.i"
include "exec/tasks.i"
include "exec/nodes.i"
include "exec/memory.i"
include "exec/io.i"
include "exec/interrupts.i"
include "hardware/intbits.i"
include "libraries/dos.i"
include "devices/narrator.i"
xref _LVOOpenLibrary,_LVOCloseLibrary,_LVORawDoFmt
xref _LVOOpenDevice,_LVOCloseDevice,_LVODoIO
xref _LVOAllocMem,_LVOFreeMem,_LVOTranslate
xref _LVOAllocSignal,_LVOFindTask,_LVOFreeSignal
xref _LVOOutput,_LVOWrite
LF equ 10 ; line feed
BUFFER equ 16384 ; nnepuskurin koko
.DosBase equ -4 ; muuttujien offsetit pinossa
.FinnslatorBase equ -8
cmdlin equ -12
cmdlen equ -16
ioreq equ -20
msgport equ -24
narrator equ -25 ; lippu: narrator.device avattu
mem equ -30 ; muistiosoitin
buffer equ -34 ; puskurin alkuosoite
MEM set 4+BUFFER ; varattavan muistin koko
main link a4,#-34 ; varataan muuttujille tila pinosta
move.l a4,a1
moveq #7,d1
1$ clr.l -(a1) ; nollataan kaikki muuttujat pinossa
dbf d1,1$
clr.w -(a1)
clr.b -1(a0,d0.l) ; nolla komentorivin loppuun
move.l a0,cmdlin(a4) ; tallenn. kom.rivin osoite
move.l d0,cmdlen(a4) ; tallenn. kom.rivin pituus
lea .DosName(pc),a1 ; dos-kirjaston nimi
moveq #0,d0 ; mik tahansa versio kelpaa
move.l $4,a6 ; execbase
jsr _LVOOpenLibrary(a6) ; avataan dos.library
move.l d0,.DosBase(a4) ; dosbase talteen
beq cleanup ; jos ei saatu auki, pois
move.l #MEM,d0 ; varattavan muistin koko
move.l #MEMF_CLEAR!MEMF_PUBLIC,d1 ; ja tyyppi
move.l $4,a6 ; execbase
jsr _LVOAllocMem(a6) ; varataan muistia puskurille
move.l d0,mem(a4) ; muistin osoite talteen
beq cleanup ; jos ei saatu, pois
move.l d0,a0
move.l #MEM,(a0)+ ; varatun muistin koko talteen
move.l a0,buffer(a4) ; puskurin osoite talteen
lea .FinnslatorName(pc),a1 ; finnslator-kirjaston nimi
moveq #0,d0 ; mik tahansa versio kelpaa
jsr _LVOOpenLibrary(a6) ; avataan finnslator.library
move.l d0,.FinnslatorBase(a4) ; perusosoite talteen
beq nofinn ; jos ei auennut, virhe
moveq #MP_SIZE,d0 ; tarvittavan portin koko
bsr createport ; luodaan viestiportti
move.l d0,msgport(a4) ; tallennetaan sen osoite
beq cleanup ; jos nolla, ei saatu porttia
moveq #NDI_SIZE,d0 ; tarvittavan iorequestin koko
bsr createio ; luodaan IOReq-struktuuri
move.l d0,ioreq(a4) ; sen osoite talteen
beq cleanup ; jos nolla, ei saatu luotua
move.l a0,a1 ; ioreq:n osoite
lea channels(pc),a0 ; kanavamaskit
move.l a0,NDI_CHMASKS(a1) ; IOReq:iin
move.w #4,NDI_NUMMASKS(a1) ; maskien lukumr
clr.b NDI_MOUTHS(a1) ; ei tarvita suuinformaatiota
lea .NarratorName(pc),a0 ; narratorin nimi
moveq #0,d0 ; unit=0
moveq #0,d1 ; flags=0
move.l $4,a6 ; execbase
jsr _LVOOpenDevice(a6) ; avataan narrator.device
tst.l d0 ; virhe?
bne nonarrator ; jos, tulostetaan virheilmoitus
st narrator(a4) ; lippu: narrator saatiin auki
move.l cmdlin(a4),a0 ; komentorivin osoite
move.l cmdlen(a4),d0 ; pituus
move.l buffer(a4),a1 ; nnepuskurin osoite
move.l #BUFFER,d1 ; ja koko
move.l .FinnslatorBase(a4),a6 ; finnslator-perusosoite
jsr _LVOTranslate(a6) ; muunnetaan teksti nteiksi
move.l ioreq(a4),a1 ; IORequestin osoite
move.l buffer(a4),IO_DATA(a1) ; asetetaan puskurin osoite
move.l #BUFFER,IO_LENGTH(a1) ; ja pituus
move.w #CMD_WRITE,IO_COMMAND(a1) ; komento = WRITE
move.l $4,a6 ; execbase
jsr _LVODoIO(a6) ; kynnistetn puhe
bra cleanup ; homma hanskassa -> pois
nonarrator lea .NarratorName(pc),a1 ; virhe: ei narratoria
bra.s err_out
nofinn lea .FinnslatorName(pc),a1 ; virhe: ei finnslatoria
err_out lea ermsg(pc),a0 ; yleinen virheilmoitus
move.l a1,d0 ; vikineen nimi d0:aan
bsr dpymsg
cleanup tst.b narrator(a4) ; narrator auki?
beq.s 10$
move.l ioreq(a4),a1 ; joo, suljetaan se
move.l $4,a6
jsr _LVOCloseDevice(a6)
10$ move.l msgport(a4),a0 ; vapautetaan portti
bsr deleteport
move.l ioreq(a4),a0 ; vapautetaan IORequest
bsr deleteio
move.l mem(a4),d0 ; muistia varattu?
beq.s 11$
move.l d0,a1 ; joo
move.l (a1),d0 ; muistin koko
move.l $4,a6 ; execbase
jsr _LVOFreeMem(a6) ; vapautetaan muisti
11$ move.l .FinnslatorBase(a4),d0 ; finnslator auki?
beq.s 12$
move.l d0,a1 ; joo
move.l $4,a6 ; execbase
jsr _LVOCloseLibrary(a6) ; suljetaan finnslator
12$ move.l .DosBase(a4),d0 ; dos auki?
beq.s 13$
move.l d0,a1 ; joo
move.l $4,a6 ; execbase
jsr _LVOCloseLibrary(a6) ; suljetaan dos
13$ moveq #0,d0 ; virhekoodi = 0
unlk a4 ; muuttujat pois pinosta
rts ; paluu dossiin
createport movem.l d2-d3/a2-a3,-(sp) ; tulos: d0 = a0 = portin osoite
addq.l #4,d0 ; tilaa portin koolle
move.l d0,d2 ; varattava koko
move.l #MEMF_CLEAR!MEMF_PUBLIC,d1
move.l $4,a6
jsr _LVOAllocMem(a6) ; varataan muisti
move.l d0,a2
tst.l d0
beq creaport1 ; ei muistia -> pois
move.l d2,(a2)+ ; portin koko talteen
moveq.l #-1,d0 ; mik tahansa sig.bitti kelpaa
jsr _LVOAllocSignal(a6) ; varataan signaalibitti
move.b d0,MP_SIGBIT(a2) ; tallennetaan bitin numero
bmi.s creaporte ; bitti ei saatu -> pois
sub.l a1,a1
jsr _LVOFindTask(a6) ; etsitn tm taski
move.l d0,MP_SIGTASK(a2) ; tallennetaan osoitin
move.b #NT_MSGPORT,LN_TYPE(a2) ; noden tyyppi = MsgPort
move.b #PA_SIGNAL,MP_FLAGS(a2) ; signaloidaan viestin saapuessa
lea MP_MSGLIST(a2),a0
NEWLIST A0 ; alustetaan portin viestilista
move.l a2,d0
bra.s creaport1 ; homma selv
deleteport movem.l d2-d3/a2-a3,-(sp) ; a0 = portin osoite
move.l a0,d0
beq.s creaport1 ; nolla -> pois
move.l a0,a2
moveq.l #0,d0
move.b MP_SIGBIT(a2),d0 ; signaalibitin numero
bmi.s creaporte ; .mi -> ei bitti varattuna
move.l $4,a6
jsr _LVOFreeSignal(a6) ; vapautetaan sigbit
creaporte move.l -(a2),d0 ; varatun muistin koko
move.l a2,a1
move.l $4,a6
jsr _LVOFreeMem(a6) ; vapautetaan muisti
moveq.l #0,d0
creaport1 movem.l (sp)+,d2-d3/a2-a3
move.l d0,a0
rts
createio movem.l d2/a2,-(sp) ; d0=koko, a0=MsgPort; tulos: d0=ioreq
move.l a0,a2 ; msgport* talteen
addq.l #4,d0 ; tilaa stuktuurin koolle
move.l d0,d2
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
move.l $4,a6
jsr _LVOAllocMem(a6) ; varataan muistia IORequestille
move.l d0,a0
tst.l d0
beq.s 100$ ; ei muistia -> pois
move.l d2,(a0)+ ; tallennetaan struktuurin koko
move.l a2,MN_REPLYPORT(a0) ; portin osoite IORequestiin
move.b #NT_MESSAGE,LN_TYPE(a0) ; portin tyyppi
subq.l #4,d2
move.w d2,MN_LENGTH(a0)
move.l a0,d0 ; palautetaan struktuurin osoite
100$ movem.l (sp)+,d2/a2
rts
deleteio move.l a0,d0 ; a0 = IoRequest
beq.s 100$ ; nolla -> ei tehd mitn
move.l a0,a1
move.l -(a1),d0 ; otetaan struktuurin koko
move.l $4,a6
jsr _LVOFreeMem(a6) ; vapautetaan muisti
100$ rts
dpymsg ;a0=fmstr, d0..d7=args
movem.l d0-d7/a0-a3,-(sp) ; rekisterit pinoon
move.l sp,a1 ; osoitin datarekistereihin pinossa
lea.l putchar(pc),a2 ; putchar-rutiinin osoite
move.l buffer(a4),a3 ; puskurin osoite
move.l $4,a6
jsr _LVORawDoFmt(a6) ; formatoidaan tulostus
move.l .DosBase(a4),a6
jsr _LVOOutput(a6) ; tulostustiedoston filehandle
move.l d0,d1
beq.s 201$ ; jos nolla, ei voida tulostaa
move.l a3,d2
200$ tst.b (a3)+ ; lasketaan merkkijonon pituus
bne.s 200$
subq.w #1,a3 ; NULL-tavua ei lasketa
move.l a3,d3 ; pituus d3:een
sub.l d2,d3
jsr _LVOWrite(a6) ; tulostetaan puskurin sislt
201$ movem.l (sp)+,d0-d7/a0-a3
rts
putchar move.b d0,(a3)+ ; putchar-rutiini RawDoFmt:lle
rts
channels dc.b 3,6,5,10,12 ; audio.devicen kanavamaskit
.DosName dc.b 'dos.library',0
.FinnslatorName dc.b 'finnslator.library',0
.NarratorName dc.b "narrator.device",0
ermsg dc.b "Unable to open %s.",LF,0
ds.w 0
end